package com.kevin.file.enums;

import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * 通用文件类型
 * <p>
 * 表示所有未明确分类的通用文件，如 .txt、.docx、.xlsx 等。
 *
 * @author 张帆
 * @date 2025/6/17 16:52
 */
@AllArgsConstructor
@Getter
public enum FileSuffix {
    /**
     * PNG 图像文件后缀
     */
    PNG("png", FileType.IMAGE),

    /**
     * JPG 图像文件后缀
     */
    JPG("jpg", FileType.IMAGE),

    /**
     * GIF 图像文件后缀
     */
    GIF("gif", FileType.IMAGE),

    /**
     * MP4 视频文件后缀
     */
    MP4("mp4", FileType.VIDEO),

    /**
     * MP3 音频文件后缀
     */
    MP3("mp3", FileType.AUDIO),

    /**
     * PDF 文档文件后缀
     */
    PDF("pdf", FileType.COMMON_FILE),

    /**
     * DOC 文档文件后缀
     */
    DOC("doc", FileType.COMMON_FILE),

    /**
     * DOCX 文档文件后缀
     */
    DOCX("docx", FileType.COMMON_FILE),

    /**
     * XLS 表格文件后缀
     */
    XLS("xls", FileType.COMMON_FILE),

    /**
     * XLSX 表格文件后缀
     */
    XLSX("xlsx", FileType.COMMON_FILE),

    /**
     * PPT 幻灯片文件后缀
     */
    PPT("ppt", FileType.COMMON_FILE),

    /**
     * PPTX 幻灯片文件后缀
     */
    PPTX("pptx", FileType.COMMON_FILE),

    /**
     * ZIP 压缩包文件后缀
     */
    ZIP("zip", FileType.ARCHIVE),

    /**
     * RAR 压缩包文件后缀
     */
    RAR("rar", FileType.ARCHIVE),

    /**
     * TXT 文本文件后缀
     */
    TXT("txt", FileType.COMMON_FILE),
    ;

    /**
     * 文件类型后缀
     */
    private final String code;

    /**
     * 文件类型
     */
    private final FileType fileType;

    /**
     * 根据文件后缀获取文件类型
     *
     * @param fileName 文件后缀
     * @return 文件类型
     */
    public static FileType getBySuffix(String fileName) {
        String suffix = getSuffix(fileName);
        return Arrays.stream(FileSuffix.values())
                .filter(fileSuffix -> fileSuffix.code.equals(suffix))
                .map(FileSuffix::getFileType)
                .findFirst()
                .orElse(FileType.OTHER);
    }

    /**
     * 根据文件后缀获取文件类型
     *
     * @param fileName 文件后缀
     * @return 文件类型
     */
    public static String getSuffix(String fileName) {
        int index = fileName.lastIndexOf(StrUtil.DOT);
        if (index == -1 || index == fileName.length() - 1) {
            return StrUtil.EMPTY;
        }

        return fileName.substring(index + 1);
    }


}
